package models;
import java.util.Date;
import java.util.Random;
import controllers.MainViewController;
import views.MainView;
/**
* The Task Generator class
*/
public class TaskGenerator implements Runnable {
private static TaskGenerator instance;
private long minServiceTime;
private long maxServiceTime;
private long minArrivalInterval;
private long maxArrivalInterval;
private Random random = new Random();
private int nrOfCustomers = 0;
private Server serverShutdown;
private long serverShutdownTime;
private Thread threadServerShutdown;
private TaskGenerator() {
}
public static TaskGenerator getInstance() {
if (instance == null) {
instance = new TaskGenerator();
}
return instance;
}
public static void deleteInstance() {
instance = null;
}
/**
* The task generator
*/
public Task generateTask() {
return new Task(System.currentTimeMillis(),
((long) (random.nextDouble() * (maxServiceTime - minServiceTime + 1))) + minServiceTime,
"Customer " + ++nrOfCustomers);
}
public void run() {
long simulationTime = TaskScheduler.getInstance().getSimulationTime();
long startTime = TaskScheduler.getInstance().getStartTime();
TaskScheduler.getInstance().start();
serverShutdownTime = TaskScheduler.getInstance().getServerShutdownTime();
serverShutdown = TaskScheduler.getInstance().getServerShutdown();
threadServerShutdown = TaskScheduler.getInstance().getThreadServerShutdown();
while (System.currentTimeMillis() <= simulationTime + startTime) {
if ((System.currentTimeMillis() - serverShutdownTime <= 1000)
&& (System.currentTimeMillis() - serverShutdownTime >= 0) && !(serverShutdown.isShutdown())) {
Thread t = new Thread(new ServerShutdownHandler());
t.start();
}
TaskScheduler.getInstance().receiveTask(generateTask());
try {
Thread.sleep(((long) (random.nextDouble() * (maxArrivalInterval - minArrivalInterval + 1)))
+ minArrivalInterval);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (Thread t : TaskScheduler.getInstance().getRunningServers())
if (t.isAlive())
t.interrupt();
MainViewController.setCancelled(true);
MainView.getLogging().append(String.format("Peak hour: %tT with number of customers: %d\n",
TaskScheduler.getInstance().getPeakHour(), TaskScheduler.getInstance().getPeakHourCustomers()));
MainView.getLogging()
.append("Average service time for simulation interval: " + Operations.getAverageServiceTime() + "\n");
MainView.getLogging()
.append("Average waiting time for simulation interval: " + Operations.getAverageWaitingTime() + "\n");
}
public class ServerShutdownHandler implements Runnable{
public void run(){
serverShutdown.setShutdown(true);
MainView.getLogging().append(
serverShutdown.getName() + " is closing at time " + String.format("%tT", new Date(System.currentTimeMillis())) + "\n");
try {
threadServerShutdown.join();
} catch (InterruptedException e) {
return;
}
MainView.getLogging().append(
serverShutdown.getName() + " has been closed at time " + String.format("%tT", new Date(System.currentTimeMillis())) + "\n");
for (Task t : serverShutdown.getTasks()) {
t.setRescheduled(true);
TaskScheduler.getInstance().receiveTask(t);
}
TaskScheduler.getInstance().getServers().remove(serverShutdown);
}
}
public long getMinServiceTime() {
return minServiceTime;
}
public void setMinServiceTime(long minServiceTime) {
this.minServiceTime = minServiceTime;
}
public long getMaxServiceTime() {
return maxServiceTime;
}
public void setMaxServiceTime(long maxServiceTime) {
this.maxServiceTime = maxServiceTime;
}
public long getMinArrivalInterval() {
return minArrivalInterval;
}
public void setMinArrivalInterval(long minArrivalInterval) {
this.minArrivalInterval = minArrivalInterval;
}
public long getMaxArrivalInterval() {
return maxArrivalInterval;
}
public void setMaxArrivalInterval(long maxArrivalInterval) {
this.maxArrivalInterval = maxArrivalInterval;
}
}